wayland: Make monitor removal work
authorMatthias Clasen <mclasen@redhat.com>
Wed, 27 Mar 2013 02:16:15 +0000 (22:16 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 27 Mar 2013 02:16:15 +0000 (22:16 -0400)
The global_removal argument is the _name_ of the object.
We were comparing it to the _object id_ of the object.
To fix this, store the name at the time the object is bound.

gdk/wayland/gdkdisplay-wayland.c
gdk/wayland/gdkprivate-wayland.h
gdk/wayland/gdkscreen-wayland.c

index 99707524b3c588f6a40163d61d4d0139e57140c3..bf220146e1b13c4d4adb73e6b518de512ba2f520 100644 (file)
@@ -113,7 +113,7 @@ gdk_registry_handle_global(void *data, struct wl_registry *registry, uint32_t id
   } else if (strcmp(interface, "wl_output") == 0) {
     output =
       wl_registry_bind(display_wayland->wl_registry, id, &wl_output_interface, 1);
-    _gdk_wayland_screen_add_output(display_wayland->screen, output);
+    _gdk_wayland_screen_add_output(display_wayland->screen, id, output);
     /* We need to roundtrip until we've received the modes and
      * geometry events for the output, which gives us the physical
      * properties and available modes on the output. */
@@ -142,6 +142,8 @@ gdk_registry_handle_global_remove(void               *data,
 
   /* We don't know what this item is - try as an output */
   _gdk_wayland_screen_remove_output_by_id (display_wayland->screen, id);
+
+  /* FIXME: the object needs to be destroyed here, we're leaking */
 }
 
 static const struct wl_registry_listener registry_listener = {
index 9c958e44706c3ed95f5e33aa0fe24fd5db5baf1f..0bdba52c61e6b17785035ce54130ddd9ec8952b4 100644 (file)
@@ -151,7 +151,8 @@ GdkWindow *_gdk_wayland_screen_create_root_window (GdkScreen *screen,
                                                   int height);
 
 GdkScreen *_gdk_wayland_screen_new (GdkDisplay *display);
-void _gdk_wayland_screen_add_output (GdkScreen *scren,
+void _gdk_wayland_screen_add_output (GdkScreen        *screen,
+                                     guint32           id,
                                      struct wl_output *output);
 void _gdk_wayland_screen_remove_output_by_id (GdkScreen *screen,
                                               guint32 id);
index 845ae141a0a4d47eddcb3db423f95f64d06007c3..c357121a7346bc197cd77754750c9a7b36bae468 100644 (file)
@@ -80,6 +80,7 @@ struct _GdkWaylandScreenClass
 struct _GdkWaylandMonitor
 {
   GdkWaylandScreen *screen;
+  guint32       id;
   struct wl_output *output;
   GdkRectangle  geometry;
   int          width_mm;
@@ -935,12 +936,14 @@ static const struct wl_output_listener output_listener =
 };
 
 void
-_gdk_wayland_screen_add_output (GdkScreen *screen,
+_gdk_wayland_screen_add_output (GdkScreen        *screen,
+                                guint32           id,
                                 struct wl_output *output)
 {
   GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (screen);
   GdkWaylandMonitor *monitor = g_new0(GdkWaylandMonitor, 1);
 
+  monitor->id = id;
   monitor->output = output;
   monitor->screen = screen_wayland;
   g_ptr_array_add(screen_wayland->monitors, monitor);
@@ -959,7 +962,7 @@ _gdk_wayland_screen_remove_output_by_id (GdkScreen *screen,
     {
       GdkWaylandMonitor *monitor = screen_wayland->monitors->pdata[i];
 
-      if (wl_proxy_get_id ((struct wl_proxy *)monitor->output) == id)
+      if (monitor->id == id)
         {
           g_ptr_array_remove (screen_wayland->monitors, monitor);